package com.vs.dao.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;


/**
 * DAO层封装接口，包含常用的CURD和分页操作
 */
public interface IBaseDao<T> {

	/**
	 * 多条件-排序-起始页-结束页
	 * @param firstindex
	 * @param maxresult
	 * @param wherejpql
	 * @param queryParams
	 * @param orderby
	 * @return
	 */
	public List findByPropertys(int firstindex, int maxresult,String wherejpql,
			Object[] queryParams,Map<String, String> orderby);

	/**
	 * 多条件带排序查询
	 */
	public List findByPropertys(String wherejpql, Object[] queryParams,
			Map<String, String> orderby);

	/**
	 * 多条件查询
	 * @param wherejpql
	 * @param queryParams
	 * @return
	 */
	public List<T> findByPropertys(String wherejpql, Object[] queryParams);

	/**
	 * 原生sql查询
	 * @param sql
	 * @return
	 */
	public List findBySQL(final String sql);

	/**
	 * 分组查询总条数
	 * @param sql
	 * @return
	 */
	public List findByGroupCount(final String where, final Object[] queryParams);

	/**
	 * 原始sql分组分页查询
	 * @param sql
	 * @return
	 */
	public List findByGroupAndPage(final int firstindex, final int maxresult,
			final String sql);

	/**
	 * 根据实体某个属性等于某值查询
	 * @param propertyName 属性名
	 * @param value 属性值
	 * @return 指定属性等于属性值的实体集合
	 */
	public List<T> findByProperty(String propertyName, Object value);

	/**
	 * 查询某个类的list
	 * @return
	 */
	public List<T> findEntityList();

	/**
	 * 根据实体某个属性进行匹配(like)查询
	 * @param propertyName 属性名
	 * @param value 属性值
	 * @return 满足条件的实体集合
	 */
	public List<T> findEntityListByLike(String propertyName, Object value);

	/**
	 * 根据条件查询并排序
	 * @param propertyName
	 * @param id
	 * @param string2
	 * @return
	 */
	public List<T> findByPropertyOrderBy(String propertyName, Object value,
			Object sortValue);

	/**
	 * 根据条件查询并排序. 取有限条数
	 * @param propertyName
	 * @param value
	 * @param sortValue
	 * @param rownum
	 * @return
	 */
	public List findByPropertyOrderByAndRownum(String propertyName,
			Object value, Object sortValue, Integer rownum);

	/**
	 * 根据条件查询并排序. 取有限条数(倒序还是升序)
	 * @param propertyName
	 * @param value
	 * @param sortValue
	 * @param sortDesc
	 * @param rownum
	 * @return
	 */
	public List findByPropertyOrderByStrAndRownum(String propertyName,
			Object value, Object sortValue, Object sortDesc, Integer rownum);

	/**
	 * 根据hql查询,直接使用HibernateTemplate的find函数. 取有限条数
	 * @param hql
	 * @param rownum
	 * @return
	 */
	public List find(String hql, Integer rownum);

	/**
	 * 根据属性名和属性值查询唯一对象.
	 * @param <T>
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public <T> T findUniqueBy(String propertyName, Object value);

	/**
	 * 创建Query对象.
	 * 对于需要first,max,fetchsize,cache,cacheRegion等诸多设置的函数,可以在返回Query后自行设置.
	 * 留意可以连续设置,如下：
	 * @param hql
	 * @param values
	 * @return 可变参数.
	 */
	public Query createQuery(String hql, Object... values);

	/**
	 * 获取记录总数
	 * @return
	 */
	public int getCount();
	
	/**
	 * 获取满足指定条件的记录总数
	 * @return 满足条件的记录数
	 */
	public int getCount(String whereSQL,Object [] params);

	/**
	 * flush
	 */
	public void flush();

	/**
	 * clear
	 */
	public void clear();

	/**
	 * remove
	 * @param o
	 */
	public void remove(Object o);

	/**
	 * 获取全部对象
	 * @param <T>
	 * @return
	 */
	public <T> List<T> getAll();

	/**
	 * 获取全部对象,带排序字段与升降序参数.
	 */
	public <T> List<T> getAll(String orderBy, boolean isAsc);

	/**
	 * merge
	 * @param <T>
	 * @return
	 */
	public <T> T merge();

	/**
	 * 保存实体
	 * @param entity 实体id
	 */
	public void save(Object entity);

	/**
	 * 更新实体
	 * @param entity 实体id
	 */
	public void update(Object entity);

	/**
	 * 删除实体
	 * @param entityClass 实体类
	 * @param entityids 实体id数组
	 */
	public void delete(Serializable... entityids);

	/**
	 * saveOrUpdate
	 * @param entity
	 */
	public void saveOrUpdate(Object entity);

	/**
	 * 获取实体
	 * @param <T>
	 * @param entityClass 实体类
	 * @param entityId 实体id
	 * @return
	 */
	public T find(Serializable entityId);

}
